"use strict";

// Import parts of electron to use
const { app, Menu, ipcMain, dialog, BrowserWindow } = require("electron");
const Papa = require("papaparse");
const iconv = require("iconv-lite");
const path = require("path");
const fs = require("fs/promises");
const url = require("url");
const { LoaderOptionsPlugin } = require("webpack");

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;

// Keep a reference for dev mode
let dev = false;

// Broken:
// if (process.defaultApp || /[\\/]electron-prebuilt[\\/]/.test(process.execPath) || /[\\/]electron[\\/]/.test(process.execPath)) {
//   dev = true
// }

if (
  process.env.NODE_ENV !== undefined &&
  process.env.NODE_ENV === "development"
) {
  dev = true;
}

// Temporary fix broken high-dpi scale factor on Windows (125% scaling)
// info: https://github.com/electron/electron/issues/9691
if (process.platform === "win32") {
  app.commandLine.appendSwitch("high-dpi-support", "true");
  app.commandLine.appendSwitch("force-device-scale-factor", "1");
}

function createWindow() {
  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 1024,
    height: 768,
    show: false,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      webSecurity: false,
    },
  });

  // and load the index.html of the app.
  let indexPath;

  if (dev && process.argv.indexOf("--noDevServer") === -1) {
    indexPath = url.format({
      protocol: "http:",
      host: "localhost:8080",
      pathname: "index.html",
      slashes: true,
    });
  } else {
    indexPath = url.format({
      protocol: "file:",
      pathname: path.join(__dirname, "dist", "index.html"),
      slashes: true,
    });
  }

  mainWindow.loadURL(indexPath);

  // Don't show until we are ready and loaded
  mainWindow.once("ready-to-show", () => {
    mainWindow.show();

    // Open the DevTools automatically if developing
    if (dev) {
      const {
        default: installExtension,
        REACT_DEVELOPER_TOOLS,
      } = require("electron-devtools-installer");

      installExtension(REACT_DEVELOPER_TOOLS).catch((err) =>
        console.log("Error loading React DevTools: ", err)
      );
      mainWindow.webContents.openDevTools();
    }
  });

  // Emitted when the window is closed.
  mainWindow.on("closed", function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null;
  });

  //-------------------------------------
  const isMac = process.platform === "darwin";
  async function saveit() {
    ipcMain.once("save-data", (event, data) => {
      console.log(data);
      dialog
        .showSaveDialog({ title: "save" })
        .then(({ canceled, filePath }) => {
          if (!canceled) fs.writeFile(filePath, Papa.unparse(data));
        })
        .catch((e) => console.log(e));
    });
    mainWindow.webContents.send("save-action");
    //ipcMain.send("save-action");
  }
  async function loadit() {
    dialog
      .showOpenDialog({ title: "open", properties: ["openFile"] })
      .then(({canceled, filePaths}) => {
        if (!canceled) {
          console.log(filePaths)
          const filePath = filePaths[0];
          fs.readFile(filePath).then((buf) => {
            // when on option set, return buffer
            let csvstring = "";
            if (buf.toString().indexOf("\uFFFD") == -1) {
              //utf-8 corretct
              csvstring = buf.toString();
            } else {
              csvstring = iconv.decode(buf, "GB18030");
            }
            const csvdata = Papa.parse(csvstring);
            if(csvdata.errors?.length) {
              // errors
              mainWindow.webContents.send("log",csvdata.errors);
            }
            //console.log(csvarray);
            mainWindow.webContents.send("load-action",csvdata.data);
          });
        } else {
          console.log("canceled!");
        }
      });
  }
  const template = [
    {
      label: "File",
      submenu: [
        isMac ? { role: "close" } : { role: "quit" },
        {
          label: "save",
          click: saveit,
        },
        {
          label: "load",
          click: loadit,
        },
      ],
    },
  ];
  const menu = Menu.buildFromTemplate(template);
  Menu.setApplicationMenu(menu);
  //---------------------------------
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", createWindow);

// Quit when all windows are closed.
app.on("window-all-closed", () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== "darwin") {
    app.quit();
  }
});

app.on("activate", () => {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (mainWindow === null) {
    createWindow();
  }
});
